#include <cstdio>
typedef long long ll; // 使用 long long 类型处理大数
ll x, y, len; int k;    // x, y 为公主的位置，len 为迷宫的边长，k 为输入的参数

// 计算方阵的大小
ll fun(int k) {
    ll sum = 1;
    for (int i = 1; i <= k; ++i) 
        sum *= 2;  // 计算 2^k 的值
    return sum;
}

// 递归函数，填充地毯
void solve(ll x, ll y, ll a, ll b, ll l) {
    if (l == 1) return; // 递归终止条件，迷宫区域的大小为 1 时结束

    // 计算当前区域的中点
    if (x - a <= l / 2 - 1 && y - b <= l / 2 - 1) {
        // 公主在左上区域
        printf("%lld %lld 1\n", a + l / 2, b + l / 2);
        solve(x, y, a, b, l / 2);
        solve(a + l / 2 - 1, b + l / 2, a, b + l / 2, l / 2);
        solve(a + l / 2, b + l / 2 - 1, a + l / 2, b, l / 2);
        solve(a + l / 2, b + l / 2, a + l / 2, b + l / 2, l / 2);
    } 
    else if (x - a <= l / 2 - 1 && y - b > l / 2 - 1) {
        // 公主在右上区域
        printf("%lld %lld 2\n", a + l / 2, b + l / 2 - 1);
        solve(a + l / 2 - 1, b + l / 2 - 1, a, b, l / 2);
        solve(x, y, a, b + l / 2, l / 2);
        solve(a + l / 2, b + l / 2 - 1, a + l / 2, b, l / 2);
        solve(a + l / 2, b + l / 2, a + l / 2, b + l / 2, l / 2);
    } 
    else if (x - a > l / 2 - 1 && y - b <= l / 2 - 1) {
        // 公主在左下区域
        printf("%lld %lld 3\n", a + l / 2 - 1, b + l / 2);
        solve(a + l / 2 - 1, b + l / 2 - 1, a, b, l / 2);
        solve(a + l / 2 - 1, b + l / 2, a, b + l / 2, l / 2);
        solve(x, y, a + l / 2, b, l / 2);
        solve(a + l / 2, b + l / 2, a + l / 2, b + l / 2, l / 2);
    } 
    else {
        // 公主在右下区域
        printf("%lld %lld 4\n", a + l / 2 - 1, b + l / 2 - 1);
        solve(a + l / 2 - 1, b + l / 2 - 1, a, b, l / 2);
        solve(a + l / 2 - 1, b + l / 2, a, b + l / 2, l / 2);
        solve(a + l / 2, b + l / 2 - 1, a + l / 2, b, l / 2);
        solve(x, y, a + l / 2, b + l / 2, l / 2);
    }
}

int main() {
    scanf("%d %lld %lld", &k, &x, &y);  // 读取输入的 k 和公主的坐标 x, y
    len = fun(k);  // 计算迷宫的大小
    solve(x, y, 1, 1, len);  // 从 (1, 1) 开始填充，递归解决问题
    return 0;
}
